//
// Created by zhupi on 2024/10/1.
//

#include "message_item_widget.h"

#include <QVBoxLayout>
#include <QFrame>
#include <QTextEdit>

namespace {
    const int FIX_WIDTH = 200;
}

MessageItemWidget::MessageItemWidget(const QString &title, QWidget *parent) : QWidget(parent)
{

    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->setContentsMargins(0, 0, 0, 0); // 消除边距

    // 折叠按钮
    toggleButton_ = new QToolButton(this);
    toggleButton_->setText(title);
    toggleButton_->setCheckable(true);
    toggleButton_->setChecked(false);  // 默认关闭状态
    toggleButton_->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    toggleButton_->setArrowType(Qt::RightArrow);  // 默认箭头方向
    toggleButton_->setFixedWidth(FIX_WIDTH);

    // 子层内容
    contentFrame_ = new QFrame(this);
    contentFrame_->setFrameShape(QFrame::StyledPanel);
    QVBoxLayout *contentLayout = new QVBoxLayout(contentFrame_);
    contentLayout->setContentsMargins(0, 0, 0, 0); // 消除内容边距

    messageListWidget_ = new MessageListWidget(this);
    contentLayout->addWidget(messageListWidget_);

    // 默认隐藏内容
    contentFrame_->setVisible(false);

    // 布局管理
    layout->addWidget(toggleButton_);
    layout->addWidget(contentFrame_);

    // 信号槽连接
    connect(toggleButton_, &QToolButton::toggled, [=](bool checked) {
        contentFrame_->setVisible(checked);
        toggleButton_->setArrowType(checked ? Qt::DownArrow : Qt::RightArrow);
    });
    Test();
}

void MessageItemWidget::DeleteMessage(const QString &itme)
{
    if (messageListWidget_ == nullptr) {
        return;
    }
    QList<QListWidgetItem *> items = messageListWidget_->findItems(itme, Qt::MatchExactly);
    for (QListWidgetItem *item : items) {
        delete messageListWidget_->takeItem(messageListWidget_->row(item));
    }
}

void MessageItemWidget::Test() {
    // 添加一些示例消息
    AddMessage("error", "This is an error message");
    AddMessage("warning", "This is a warning message");
    AddMessage("info", "This is an info message");
}

bool MessageItemWidget::SearchMessage(const QString &searchTerm)
{
    if (searchTerm.isEmpty()) {
        return false;
    }
    if (messageListWidget_ == nullptr) {
        return false;
    }

    // 如果当前窗口是隐藏的，将它显示
    if (!contentFrame_->isVisible()) {
        contentFrame_->setVisible(true);
        toggleButton_->setArrowType( Qt::DownArrow);
    }

    int startIndex = messageListWidget_->currentRow() + 1; // 从当前选中项的下一项开始查找
    int itemCount = messageListWidget_->count();

    for (int index = startIndex; index < itemCount; ++index) {
        QListWidgetItem *item = messageListWidget_->item(index);
        if (item->text().contains(searchTerm, Qt::CaseInsensitive)) {
            messageListWidget_->setCurrentItem(item);
            messageListWidget_->scrollToItem(item);
            // 位置改变，发送信号
            // 获取该项在 QListWidget 中的可视矩形
            QRect itemRect = messageListWidget_->visualItemRect(item);
            // 将该项的坐标映射到全局坐标系
            QPoint globalItemPos = messageListWidget_->mapToGlobal(itemRect.topLeft());
            emit PositionChangeSg(globalItemPos);
            return true;
        }
    }

    messageListWidget_->clearSelection();
    messageListWidget_->setCurrentRow(-1);
    return false;
}

void MessageItemWidget::AddMessage(const QString &type, const QString &message) {

    QListWidgetItem *item = new QListWidgetItem(message, messageListWidget_);

    if (type == "error") {
        item->setIcon(QIcon("D:/work/icon/3D.png")); // 设置错误消息的图标
    } else if (type == "warning") {
        item->setIcon(QIcon("D:/work/icon/mid.png")); // 设置警告消息的图标
    } else if (type == "info") {
        item->setIcon(QIcon("D:/work/icon/leaf.png")); // 设置信息消息的图标
    }

    messageListWidget_->addItem(item);

}

void MessageItemWidget::UpdateSearch() {

}

int MessageItemWidget::HighlightMatchingItems(const QString &searchString)
{
    if (messageListWidget_ == nullptr) {
        return -1;
    }

    int index = 0;
    // 遍历 QListWidget 中的所有项
    for (int i = 0; i < messageListWidget_->count(); ++i) {
        QListWidgetItem* item = messageListWidget_->item(i);

        // 判断当前项的文本是否包含搜索字符串
        if (item->text().contains(searchString, Qt::CaseInsensitive)) {
            // 如果包含，设置背景为深色
            item->setBackground(Qt::darkGray);
            item->setForeground(Qt::white); // 改变文本颜色为白色，使其更明显
            index++;
        } else {
            // 否则，恢复为默认颜色
            item->setBackground(Qt::white);
            item->setForeground(Qt::black);
        }
    }
    return index;
}

bool MessageItemWidget::SearchPrevMessage(const QString &searchTerm)
{
    if (searchTerm.isEmpty()) {
        return false;
    }
    if (messageListWidget_ == nullptr) {
        return false;
    }

    // 如果当前窗口是隐藏的，将它显示
    if (!contentFrame_->isVisible()) {
        contentFrame_->setVisible(true);
        toggleButton_->setArrowType( Qt::DownArrow);
    }

    int startIndex = messageListWidget_->currentRow() - 1; // 从当前选中项的下一项开始查找
    int itemCount = messageListWidget_->count();

    for (int index = startIndex; index > 0; --index) {
        QListWidgetItem *item = messageListWidget_->item(index);
        if (item->text().contains(searchTerm, Qt::CaseInsensitive)) {
            messageListWidget_->setCurrentItem(item);
            messageListWidget_->scrollToItem(item);
            // 位置改变，发送信号
            // 获取该项在 QListWidget 中的可视矩形
            QRect itemRect = messageListWidget_->visualItemRect(item);
            // 将该项的坐标映射到全局坐标系
            QPoint globalItemPos = messageListWidget_->mapToGlobal(itemRect.topLeft());
            emit PositionChangeSg(globalItemPos);
            return true;
        }
    }

    messageListWidget_->clearSelection();
    messageListWidget_->setCurrentRow(-1);
    return false;
}

void MessageItemWidget::DeleteSelectedMessage()
{
    QList<QListWidgetItem *> selectedItems = messageListWidget_->selectedItems();
    if (selectedItems.isEmpty()) {
        QMessageBox::information(this, "删除", "请选择要删除的消息");
        return;
    }

    for (QListWidgetItem *item : selectedItems) {
        delete messageListWidget_->takeItem(messageListWidget_->row(item));
    }
}


